/******************************************************************************* * Copyright (c) 2002, 2005 Object Factory Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Object Factory Inc. - Initial implementation *******************************************************************************/ package org.eclipse.ant.internal.ui.dtd; /** * A Dfm is an IModel converted to a form more appropriate for validation. The whole point of a Dfm is to run fast. * * @author Bob Foster */ public interface IDfm { /** * Return true if no further symbols are required. */ boolean isAccepting(); /** * If the symbol represented by name is acceptable, return the dfm to apply to the next (child) symbol. Otherwise, return null. */ IDfm advance(String name); /** * If the symbol represented by the namespace,name pair is acceptable, return the dfm to apply to the next (child) symbol. Otherwise, return null. */ IDfm advance(String namespace, String localname); /** * If the symbol represented by name is acceptable to <code>advance()</code> return the corresponding atom. Otherwise, return null. */ IAtom getAtom(String name); /** * Return the symbols for which <code>advance()</code> will return a next dfm. If no symbols will advance this dfm or if any symbol will, returns * an empty array. Use <code>isAny()</code> and <code>isEmpty()</code> to disambiguate the cases. */ String[] getAccepts(); /** * Return the symbols for which <code>advance()</code> will return a next dfm. If no symbols will advance this dfm or if any symbol will, returns * null. Use <code>isAny()</code> and <code>isEmpty()</code> to disambiguate the cases. */ Object[] getKeys(); /** * Return true if dfm will accept any symbol and return itself; false otherwise. This interface keeps the dfm from needing schema knowledge, but a * better way to process an ANY dfm for elements is use the schema to look up the element and use its dfm instead of this one. */ boolean isAny(); /** * Return true if dfm will reject every symbol (<code>advance()</code> returns null); false otherwise. Included for completeness, so every element * can have a dfm, regardless of its type. */ boolean isEmpty(); }